﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using BuyRitmus.Negocio.Model;

namespace BuyRitmus.Negocio.DAL
{
    public class EventoDAL
    {
        private const string INSERT_EVENTO = "insert into EVENTO (TITULO, DESCRICAO, DATA, ATIVO, UF, FOTO_MINIATURA) VALUES (@titulo, @descricao, @data, @ativo, @uf, @foto_miniatura);";
        private const string UPDATE_EVENTO = "update EVENTO set TITULO = {0}, DESCRICAO = {1}, DATA = {2}, ATIVO = {3};";
        private const string SELECT_EVENTO = "select ID_EVENTO, TITULO, DESCRICAO, DATA, ATIVO, UF, FOTO_MINIATURA from EVENTO WHERE ATIVO = @ativo;";
        private const string SELECT_EVENTO_BY_ID = "select ID_EVENTO, TITULO, DESCRICAO, DATA, ATIVO, UF, FOTO_MINIATURA from EVENTO WHERE ID_EVENTO = @id_evento;";

        private ConnectionStringSettings setup = ConfigurationManager.ConnectionStrings["ProducaoConnectionString"];

        public void Inserir(EventoDTO evento)
        {
            try
            {
                using (SqlConnection cnn = new SqlConnection(setup.ConnectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(INSERT_EVENTO, cnn))
                    {
                        cmd.Parameters.Add("@titulo", SqlDbType.VarChar).Value = evento.Titulo;
                        cmd.Parameters.Add("@descricao", SqlDbType.VarChar).Value = evento.Descricao;
                        cmd.Parameters.Add("@data", SqlDbType.DateTime).Value = evento.Data;
                        cmd.Parameters.Add("@ativo", SqlDbType.Bit).Value = true;
                        cmd.Parameters.Add("@uf", SqlDbType.VarChar).Value = evento.Estado.Sigla;
                        cmd.Parameters.Add("@foto_miniatura", SqlDbType.VarChar).Value = evento.FotoMiniatura;
                        
                        cnn.Open();
                        cmd.ExecuteNonQuery();
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public IList<EventoDTO> Listar(string uf)
        {
            return this.Listar(uf, true);
        }

        public EventoDTO Pegar(int id)
        {
            try
            {
                using (SqlConnection cnn = new SqlConnection(setup.ConnectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(SELECT_EVENTO_BY_ID, cnn))
                    {
                        cmd.Parameters.Add("@id_evento", SqlDbType.Int).Value = id;

                        cnn.Open();

                        using (SqlDataReader dr = cmd.ExecuteReader())
                        {
                            if (dr.Read())
                            {
                                return this.MontarEvento(dr);
                            }
                            return null;
                        }
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public IList<EventoDTO> Listar(string uf, bool ativo) 
        {
            try
            {
                IList<EventoDTO> eventos = new List<EventoDTO>();

                using (SqlConnection cnn = new SqlConnection(setup.ConnectionString))
                {
                    using (SqlCommand cmd = new SqlCommand(SELECT_EVENTO, cnn))
                    {
                        cmd.Parameters.Add("@ativo", SqlDbType.Bit).Value = ativo;

                        cnn.Open();

                        using (SqlDataReader dr = cmd.ExecuteReader())
                        {
                            while (dr.Read())
                            {
                                eventos.Add(this.MontarEvento(dr));                                   
                            }
                        }
                    }
                }

                return eventos;
            }
            catch (Exception)
            {
                throw;
            }
        }

        private EventoDTO MontarEvento(SqlDataReader dr) 
        {
            EventoDTO evento = new EventoDTO();

            if (!dr.IsDBNull(0))
                evento.Id = dr.GetInt32(0);
            if (!dr.IsDBNull(1))
                evento.Titulo = dr.GetString(1);
            if (!dr.IsDBNull(2))
                evento.Descricao = dr.GetString(2);
            if (!dr.IsDBNull(3))
                evento.Data = dr.GetDateTime(3);
            if (!dr.IsDBNull(4))
                evento.Ativo = dr.GetBoolean(4);
            if (!dr.IsDBNull(5))
                evento.Estado.Sigla = dr.GetString(5);
            if (!dr.IsDBNull(6))
                evento.FotoMiniatura = dr.GetString(6);
            return evento;
        }
    }
}
